Add product guides for Grimoire 1.x - #207
Conversation
* fix: patch release-blocking inconsistencies - install.sh: default LITTLEIMP_VERSION to the current release (was 0.1.0-beta) - extractors: accept www.github.com URLs, restore .git suffix stripping, and send Grimoire/1.0.0 User-Agent from all fetchers - e2e: align mock daemon and specs with the real daemon version and repo URLs - embedding-repository: rebuild the sqlite-vec index in a single atomic transaction instead of thousands of per-row transactions on every boot - docs: refresh release-checklist.md and update-system.md version strings (0.1.0-beta -> 1.0.0) and align test fixtures * chore(release): publish 1.0.1 patch - Bump version identity to 1.0.1 across package manifests, install.sh, API/MCP contract, docs, e2e mocks, and test fixtures - Derive the outgoing User-Agent from the packaged version instead of hardcoding it, so fetchers stop drifting from the release version - Build release archives and fill the Homebrew formula and checksum baselines with the real 1.0.1 artifact SHAs - Add a 1.0.1 changelog entry; regenerate API docs
* fix: patch release-blocking inconsistencies - install.sh: default LITTLEIMP_VERSION to the current release (was 0.1.0-beta) - extractors: accept www.github.com URLs, restore .git suffix stripping, and send Grimoire/1.0.0 User-Agent from all fetchers - e2e: align mock daemon and specs with the real daemon version and repo URLs - embedding-repository: rebuild the sqlite-vec index in a single atomic transaction instead of thousands of per-row transactions on every boot - docs: refresh release-checklist.md and update-system.md version strings (0.1.0-beta -> 1.0.0) and align test fixtures * chore(release): publish 1.0.1 patch - Bump version identity to 1.0.1 across package manifests, install.sh, API/MCP contract, docs, e2e mocks, and test fixtures - Derive the outgoing User-Agent from the packaged version instead of hardcoding it, so fetchers stop drifting from the release version - Build release archives and fill the Homebrew formula and checksum baselines with the real 1.0.1 artifact SHAs - Add a 1.0.1 changelog entry; regenerate API docs
- Bump version identity to 1.1.0 across package manifests, install.sh, API/MCP contract, docs, e2e mocks, and test fixtures - Carry the 1.0.1 release-identity fixes onto the release branch: installer version default, Grimoire/<version> user-agents, www.github.com / .git handling, atomic sqlite-vec index rebuild - Build 1.1.0 release archives and fill the Homebrew formula and checksum baselines with the real artifact SHAs - Add a 1.1.0 changelog entry; regenerate API docs Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com> Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Resolve all conflicts in favor of the 1.1.0 release branch (superset of the 1.0.1 content cherry-picked earlier plus the 1.1.0 version bumps). Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com> Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signs release/*.tar.gz with a detached gpg signature (key auto-detected from the repo git user.email), verifies, runs release:validate --require-signatures, and exports the public key + fingerprint. Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com> Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Keep in-repo Markdown under docs/grimoire for GitHub readers while the published site lives at goniszewski.com/grimoire.
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
There was a problem hiding this comment.
馃挕 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ad64c269f8
鈩癸笍 About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 馃憤.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| new Promise<void>((resolve, reject) => { | ||
| if (readLater) store.markReadLater(id, { onSuccess: () => resolve(), onError: () => reject(new Error("failed")) }); | ||
| else store.clearReadLater(id, { onSuccess: () => resolve(), onError: () => reject(new Error("failed")) }); |
There was a problem hiding this comment.
Use mutateAsync for each bulk read-later update
When two or more bookmarks are selected, these promises wrap consecutive calls to the same updateBookmarkMutation.mutate and depend on its per-call callbacks. TanStack Query only retains the callbacks for the latest consecutive mutate call, so the earlier promises never settle and Promise.all never reaches either branch; the daemon updates may finish, but selection mode never exits and no result toast appears. Expose a mutateAsync-based operation or aggregate completion outside the shared mutation observer.
Useful? React with 馃憤聽/ 馃憥.
| }); | ||
| toast({ title: `Moved ${selectedIds.size} bookmark${selectedIds.size !== 1 ? "s" : ""} to "${category}"` }); | ||
| exitSelectionMode(); | ||
| void Promise.all(ids.map((id) => store.deleteBookmark(id))) |
There was a problem hiding this comment.
Preserve undo for partial bulk-delete successes
If one delete request fails after other requests have succeeded, Promise.all rejects and skips the only branch that offers Undo. The successfully deleted bookmarks therefore remain in trash while the UI reports only that the bulk operation failed and keeps the stale selection active. Track individual results with Promise.allSettled or otherwise expose the successful subset so users can undo or accurately understand the partial deletion.
Useful? React with 馃憤聽/ 馃憥.
| const bytes = new Uint8Array(await res.arrayBuffer()); | ||
| if (bytes.byteLength > MAX_UPGRADE_ARTIFACT_BYTES) { |
There was a problem hiding this comment.
Enforce the upgrade size cap while streaming
When an update server omits or understates Content-Length, arrayBuffer() buffers the complete archive before the byte-limit check runs. Because this occurs before checksum or signature verification, an attacker-controlled custom release endpoint鈥攐r a compromised upstream鈥攃an send an unbounded response and exhaust the CLI process's memory despite the advertised 512 MiB cap. Read and cancel the response stream once the running total exceeds the limit, as the page and model-catalog fetchers already do.
Useful? React with 馃憤聽/ 馃憥.
Use mutateAsync for bulk read-later, preserve undo on partial bulk deletes, and enforce upgrade artifact size limits while streaming.
|
* fix(security): harden SSRF, upgrades, bind policy, and mutation UX Address the comprehensive code-review findings: validate redirects before following them, reject arbitrary HTTP update sources, require signed remote upgrades, fail closed on non-loopback binds outside containers, reject URL credentials consistently, apply default body limits, drop unsafe restore bypass from HTTP, and make frontend mutations confirm before success UX. Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com> * test: align category filter expectations and simplify update check types Prefer category_id-only list/search params in hook tests, and use a concrete ApiUpdateCheckResult shape to avoid deep DTO instantiation. Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com> * fix(ui): keep Add Bookmark validation copy e2e-compatible Preserve a "valid URL" phrase in the dialog error so existing journey coverage continues to match the safer http(s)/no-credentials check. Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com> * feat(settings): add AI provider model catalog picker - daemon: GET /settings/ai-models lists the OpenRouter model catalog with a free-only filter; guarded by the X-LittleImp-Frontend header, SSRF checks (private-host base URLs and redirect final hops), a 15s timeout, and a 10 MB response cap; upstream error bodies are never relayed - settings: default OpenRouter model becomes openai/gpt-latest (drop the confusing '~' fallback prefix); stored values are normalized on load - frontend: searchable model combobox with free-only toggle, loading/error/ retry states, and custom (typed) model entry - contract, generated API docs, fixtures, and tests updated Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com> Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com> * fix(security): keep private update sources working and align fetcher UA - update/service: thread allowPrivateHosts into the real-fetch path so the CLI's local test sources (e.g. --source http://127.0.0.1:9999) are not blocked by the new per-hop redirect guard; private hosts stay rejected by default on the HTTP route - pipeline/fetcher: send the current Grimoire/<version> user-agent (was the stale LittleImp/0.0 string pointing at the old little-imp repo URL) - tests: cover private-source checkForUpdates behavior and the fetcher UA Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com> Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com> * Add product guides for Grimoire 1.x (#207) * feat(TASK-147): add static public demo mode * fix: allow explicitly configured remote origins * fix(TASK-147): polish public demo overlays and detail state * fix(TASK-147): align demo E2E with v1.1 release baseline * fix(release): restore installable v1.1 lockfile * fix(TASK-147): configure automatic Sonar fixture exclusion * chore(docs): clean up redundant documentation * chore(docs): clean up redundant project artifacts --------- Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>
* fix(security): harden SSRF, upgrades, bind policy, and mutation UX Address the comprehensive code-review findings: validate redirects before following them, reject arbitrary HTTP update sources, require signed remote upgrades, fail closed on non-loopback binds outside containers, reject URL credentials consistently, apply default body limits, drop unsafe restore bypass from HTTP, and make frontend mutations confirm before success UX. Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com> * test: align category filter expectations and simplify update check types Prefer category_id-only list/search params in hook tests, and use a concrete ApiUpdateCheckResult shape to avoid deep DTO instantiation. Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com> * fix(ui): keep Add Bookmark validation copy e2e-compatible Preserve a "valid URL" phrase in the dialog error so existing journey coverage continues to match the safer http(s)/no-credentials check. Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com> * feat(settings): add AI provider model catalog picker - daemon: GET /settings/ai-models lists the OpenRouter model catalog with a free-only filter; guarded by the X-LittleImp-Frontend header, SSRF checks (private-host base URLs and redirect final hops), a 15s timeout, and a 10 MB response cap; upstream error bodies are never relayed - settings: default OpenRouter model becomes openai/gpt-latest (drop the confusing '~' fallback prefix); stored values are normalized on load - frontend: searchable model combobox with free-only toggle, loading/error/ retry states, and custom (typed) model entry - contract, generated API docs, fixtures, and tests updated Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com> Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com> * fix(security): keep private update sources working and align fetcher UA - update/service: thread allowPrivateHosts into the real-fetch path so the CLI's local test sources (e.g. --source http://127.0.0.1:9999) are not blocked by the new per-hop redirect guard; private hosts stay rejected by default on the HTTP route - pipeline/fetcher: send the current Grimoire/<version> user-agent (was the stale LittleImp/0.0 string pointing at the old little-imp repo URL) - tests: cover private-source checkForUpdates behavior and the fetcher UA Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com> Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com> * Add product guides for Grimoire 1.x (#207) * feat(TASK-146): add Grimoire v0.5 SQLite migration CLI and API Ship inspect/apply (with dry-run) for v0.5 data dirs and archives, including owner selection, optional password verification, media safety checks, and docs/task report updates. * feat(TASK-146): harden v0.5 migrate for non-destructive production use Keep source DBs untouched via temp snapshots, refuse unsafe archives before extract, commit applies transactionally with locks and rollback-safe media cleanup, and preserve migrated content/FTS across reprocess. * fix(TASK-146): harden legacy migration transaction safety * fix(release): restore installable v1.1 lockfile * chore(docs): clean up redundant documentation * chore(docs): clean up redundant project artifacts * fix(TASK-146): harden legacy migration and mark it experimental --------- Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>



Summary
docs/grimoire/(intro, quick start, usage, development, native install, remote access, FAQ)package.jsonhomepage to the published docs URLNote
This branch is based on
release-1.1.0, so the PR also includes the release commits not yet onmain. The docs commit itself is docs-only.Test plan
docs/grimoire/*.mdfor accuracy against implemented features